﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Web;
using Ext.Net;

namespace ERP.Modules
{
    public partial class FileManager : System.Web.UI.UserControl
    {
        #region[Define]
        protected string Str = string.Empty;
        private readonly string pathFolderRoot = ConfigurationManager.AppSettings["FolderRoot"];
        #endregion

        #region[Controller]
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                GetFolderRoot();
            }
        }
        protected void btnSubmitSelect_Click(object sender, DirectEventArgs e)
        {
            foreach (var row in ImageView.SelectedRows)
            {
                lbFileName.Text = row.RecordID;
            }
        }
        protected void btnClear_Click(object sender, DirectEventArgs e)
        {
            ImageView.DeselectAll();
            lbFileName.Text = string.Empty;
        }
        protected void btnCreateFolder_Click(object sender, DirectEventArgs e)
        {
            txtPath.Text = pathFolderRoot;
            txtFolderName.Text = string.Empty;
            hdPath.Text = string.Empty;
            WindowCreateFolder.Show();
        }
        protected void btnRefreshFolder_Click(object sender, DirectEventArgs e)
        {
            var sm = grFolder.GetSelectionModel() as CheckboxSelectionModel;
            hdPath.Text = string.Empty;
            GetFolderRoot();
            GetFile(string.Empty);
            if (sm != null) sm.ClearSelection();
        }
        protected void btnDelFolder_Click(object sender, DirectEventArgs e)
        {
            var sm = grFolder.GetSelectionModel() as CheckboxSelectionModel;
            if (sm != null)
                foreach (var row in sm.SelectedRows)
                {
                    try
                    {
                        if (FileExists(row.RecordID))
                        {
                            HTML.clsFormat.Alert_ERROR("Lỗi",
                                "Tập tin còn tồn tại trong thư mục.Vui lòng xoá tập tin trước !");
                        }
                        else
                        {
                            var pathUrl = Server.MapPath(pathFolderRoot + row.RecordID);
                            Directory.Delete(pathUrl);
                            HTML.clsFormat.Alert_INFO("Thông Báo", "Xoá thư mục thành công !");
                        }
                    }
                    catch (Exception ex)
                    {
                        HTML.clsFormat.Alert_ERROR("Thông Báo", ex.Message);
                    }
                }
            GetFolderRoot();
        }
        protected void StoreFolder_RefreshData(object sender, StoreReadDataEventArgs e)
        {
            GetFolderRoot();
        }
        protected void StoreFile_RefreshData(object sender, StoreReadDataEventArgs e)
        {
            GetFile(hdPath.Text);
        }
        protected void PathDb_Click(object sender, DirectEventArgs e)
        {
            var Name = e.ExtraParams["Name"];
            GetFile(Name);
            hdPath.Text = Name;
        }
        protected void btnClose_Click(object sender, DirectEventArgs e)
        {
            WindowFileManager.Close();
        }
        protected void btnCreate_Click(object sender, DirectEventArgs e)
        {
            if (String.IsNullOrEmpty(txtFolderName.Text) && String.IsNullOrEmpty(txtPath.Text))
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", "Vui lòng nhập vào tên thư mục để tạo mới");
            }
            else
            {
                try
                {
                    var pathUrl = Server.MapPath(pathFolderRoot + txtFolderName.Text);
                    txtPath.Text = pathUrl;
                    Directory.CreateDirectory(pathUrl);
                    HTML.clsFormat.Alert_INFO("Thông Báo",
                        "Thư mục " + txtFolderName.Text + " được khởi tạo thành công !");
                    WindowCreateFolder.Close();
                    GetFolderRoot();
                }
                catch (Exception ex)
                {
                    HTML.clsFormat.Alert_ERROR("Lỗi", ex.Message);
                }

            }
        }
        protected void btnCancel_Click(object sender, DirectEventArgs e)
        {
            WindowCreateFolder.Close();
        }
        protected void btnUpload_Click(object sender, DirectEventArgs e)
        {
            if (String.IsNullOrEmpty(FileUploadPanel.FileName))
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", "Không có tập tin được chọn !");
            }
            else if (String.IsNullOrEmpty(hdPath.Text))
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", "Vui lòng chọn thư mục cần tải lên !");
            }
            else
            {
                if (FileNameExists(hdPath.Text + "/"))
                {
                    HTML.clsFormat.Alert_ERROR("Lỗi",
                        "Tên tập tin này đã tồn tại trong thư mục " + hdPath.Text +
                        " vui lòng đổi tên tập tin trước khi tải lên !");
                }
                else
                {
                    Upload(Server.MapPath(pathFolderRoot + hdPath.Text + "/"));
                    GetFile(hdPath.Text);
                }
            }
        }
        protected void btnDelFile_Click(object sender, DirectEventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(hdPath.Text) && String.IsNullOrEmpty(lbFileName.Text))
                {
                    HTML.clsFormat.Alert_ERROR("Lỗi", "Vui lòng chọn tập tin để xoá !");
                }
                else
                {
                    foreach (var row in ImageView.SelectedRows)
                    {
                        File.Delete(HttpContext.Current.Server.MapPath(pathFolderRoot + hdPath.Text + "/") +
                                    row.RecordID + "");
                    }
                    HTML.clsFormat.Alert_INFO("Thông Báo", "Xoá tập tin thành công !");
                    GetFile(hdPath.Text);
                }
            }
            catch (Exception ex)
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", ex.Message);
            }
        }
        #endregion

        #region[Method]
        private void GetFolderRoot()
        {
            var pathRoot = Server.MapPath(pathFolderRoot);
            var dir = new DirectoryInfo(pathRoot);
            StoreFolder.DataSource = dir.GetDirectories("*.*");
            StoreFolder.DataBind();
        }
        private void GetFile(string File)
        {
            var pathUrl = Server.MapPath(pathFolderRoot + File + "/");
            var files = Directory.GetFiles(pathUrl);
            var data = new List<object>(files.Length);
            foreach (var fileName in files)
            {
                var fi = new FileInfo(fileName);

                data.Add(new
                {
                    name = fi.Name,
                    url = pathFolderRoot + File + "/" + fi.Name
                });
            }
            StoreFile.DataSource = data;
            StoreFile.DataBind();
        }
        private bool FileExists(string File)
        {
            var check = false;
            var pathUrl = Server.MapPath(pathFolderRoot + File + "/");
            var files = Directory.GetFiles(pathUrl);
            foreach (var fileName in files)
            {
                var fi = new FileInfo(fileName);
                if (fi.Exists)
                {
                    check = true;
                }
            }
            return check;
        }
        private bool FileNameExists(string File)
        {
            var check = false;
            var pathUrl = Server.MapPath(pathFolderRoot + File + "/");
            var files = Directory.GetFiles(pathUrl);
            foreach (var fileName in files)
            {
                var fi = new FileInfo(fileName);
                if (fi.Name == FileUploadPanel.FileName)
                {
                    check = true;
                }
            }
            return check;
        }
        private void Upload(string path)
        {
            try
            {
                string tpl;
                tpl = "Tập tin đã tải lên : {0} <br/>Dung lượng : {1} bytes";
                if (FileUploadPanel.HasFile)
                {
                    if (CheckFileType())
                    {
                        FileUploadPanel.PostedFile.SaveAs(path + FileUploadPanel.FileName);
                        X.Msg.Show(new MessageBoxConfig
                        {
                            Buttons = MessageBox.Button.OK,
                            Icon = MessageBox.Icon.INFO,
                            Title = "Thông báo",
                            Message =
                                string.Format(tpl, FileUploadPanel.PostedFile.FileName,
                                    FileUploadPanel.PostedFile.ContentLength)
                        });
                    }
                    else
                    {
                        X.Msg.Show(new MessageBoxConfig
                        {
                            Buttons = MessageBox.Button.OK,
                            Icon = MessageBox.Icon.ERROR,
                            Title = "Lỗi",
                            Message = "Tập tin " + FileUploadPanel.FileName.Split('.')[1] + " không được hỗ trợ !"
                        });
                    }
                }
                else
                {
                    X.Msg.Show(new MessageBoxConfig
                    {
                        Buttons = MessageBox.Button.OK,
                        Icon = MessageBox.Icon.ERROR,
                        Title = "Lỗi",
                        Message = "Không có tập tin được chọn"
                    });
                }
            }
            catch (Exception ex)
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", ex.Message);
            }
        }
        private bool CheckFileType()
        {
            var check = FileUploadPanel.PostedFile.FileName.EndsWith(".zip") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".jpg") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".png") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".gif") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".txt") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".xls") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".xlsx") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".doc") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".docx") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".xml");
            return check;
        }
        #endregion
    }
}